//
//  CommentViewController.m
//  Connotation
//
//  Created by LZXuan on 15-4-8.
//  Copyright (c) 2015年 LZXuan. All rights reserved.
//

#import "CommentViewController.h"
#import "CommentTableViewCell.h"
#import "UIImageView+WebCache.h"
#import "LZXHttpRequest.h"
#import "CommentModel.h"
#import "LZXHelper.h"
#import "MJRefresh.h"
@interface CommentViewController ()<UITableViewDataSource,UITableViewDelegate>
{
   
    LZXHttpRequest *_httpRequest;
    //加载起始页码
    NSInteger _currentPage;
    //加载页码数
    NSInteger _count;
}
@end

@implementation CommentViewController
- (void)dealloc {
    self.tableView=nil;
    self.tableViewData=nil;
    self.commentUrl = nil;
    _httpRequest=nil;
    self.page_size=nil;
    self.total=nil;
    [super dealloc];
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    self.navigationController.navigationBar.tintColor=[UIColor whiteColor];
    self.view.backgroundColor=[UIColor whiteColor];
    //NSLog(@"评论接口：%@",self.commentUrl);
    [super viewDidLoad];
    self.tableViewData=[[NSMutableArray alloc]init];
    _httpRequest = [[LZXHttpRequest alloc] init];
    [self creatTableView];
    
    [self isNetWork];
    
    
}
#pragma mark - MJ刷新
/**
 *  集成刷新控件
 */
- (void)setupRefresh
{
    // 1.下拉刷新(进入刷新状态就会调用self的headerRereshing)
    [self.tableView addHeaderWithTarget:self action:@selector(headerRereshing)];
    //自动刷新(一进入程序就下拉刷新)
    [self.tableView headerBeginRefreshing];
    
    // 2.上拉加载更多(进入刷新状态就会调用self的footerRereshing)
    [self.tableView addFooterWithTarget:self action:@selector(footerRereshing)];
    
    // 设置文字(也可以不设置,默认的文字在MJRefreshConst中修改)
    self.tableView.headerPullToRefreshText = @"下拉可以刷新了";
    self.tableView.headerReleaseToRefreshText = @"松开马上刷新了";
    self.tableView.headerRefreshingText = @"正在拼命加载中";
    
    self.tableView.footerPullToRefreshText = @"上拉可以加载更多数据了";
    self.tableView.footerReleaseToRefreshText = @"松开马上加载更多数据了";
    self.tableView.footerRefreshingText = @"正在拼命加载中";
}
#pragma mark 开始进入刷新状态
- (void)headerRereshing
{
    _currentPage=0;
    [self loadDataPage:_currentPage count:6];
    
    /*
     // 2.2秒后刷新表格UI
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
     // 刷新表格
     [self.tableView reloadData];
     
     // (最好在刷新表格后调用)调用endRefreshing可以结束刷新状态
     [self.tableView headerEndRefreshing];
     });
     */
}

- (void)footerRereshing
{
    if (self.tableViewData.count<[self.total integerValue]) {
        _currentPage ++;
    [self loadDataPage:_currentPage count:6];
        
    }else{
        [SVProgressHUD showSuccessWithStatus:@"已经是最后一页"];
        [self.tableView footerEndRefreshing];
    }
    
        /*
     // 2.2秒后刷新表格UI
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
     // 刷新表格
     [self.tableView reloadData];
     
     // (最好在刷新表格后调用)调用endRefreshing可以结束刷新状态
     [self.tableView footerEndRefreshing];
     });
     */
}


#pragma mark - 解归档
//解归档
-(void)archiveMyData{
    NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    NSString *filePath=[docPath stringByAppendingPathComponent:@"comment"];
    BOOL archivesuccess=[NSKeyedArchiver archiveRootObject:self.tableViewData toFile:filePath];
    
    //NSLog(@"文件路径%@",filePath);
    if(archivesuccess){
        NSLog(@"保存成功");
    }
}
-(void)unarchiveMyData{
    NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    NSString *filePath=[docPath stringByAppendingPathComponent:@"comment"];
    self.tableViewData=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"解档成功");
}
-(void)isNetWork{
    BOOL isnet=[LZXHelper reachability];
    if(isnet){
        [self setupRefresh];
        
    }else {
        [self unarchiveMyData];
        [_tableView reloadData];
    }
}

-(void)creatTableView{
    self.tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, kScreenSize.width, kScreenSize.height-64)];
    self.tableView.delegate=self;
    self.tableView.dataSource=self;
    self.tableView.tableFooterView=[[UITableViewHeaderFooterView alloc]init];
    [self.view addSubview:self.tableView];
    //使分割线顶格
    if([self.tableView respondsToSelector:@selector(setSeparatorInset:)]){
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }
    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)])
        
    {
        
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
        
    }
    //设置分割线的颜色
    self.tableView.separatorColor=[UIColor blueColor];
    [self.tableView registerNib:[UINib nibWithNibName:@"CommentTableViewCell" bundle:nil] forCellReuseIdentifier:@"CommentTableViewCell"];
    
    [self.tableView release];
    [self.tableView.tableFooterView release];
}
//下载数据
 //按页下载
 - (void)loadDataPage:(NSInteger)page count:(NSInteger)count {
     //视频界面 需要 完全重写
     
     
     NSString *url = [self.commentUrl stringByAppendingString:[NSString stringWithFormat:@"&page=%ld&page_size=%ld&max_timestamp=-1",page,count]];
     
     //在非arc 中 block 出现 self (或者成员变量的操作) 那么我们需要用__block 否则可能会导致死锁
     //在arc 下面block 出现 出现 self (或者成员变量的操作) 那么我们需要用__weak 否则可能会导致死锁
     
     __block CommentViewController *mySelf = self;
     
     [_httpRequest downloadRequestWithUrl:url
                                  success:^(LZXHttpRequest *request) {
                                      //下载成功
                                
                                      
                                      [mySelf downloadDataSuccess:request];
                                      
                                  } fail:^(NSError *error) {
                                      NSLog(@"下载失败");
                                      
                                      
                                  }];
 }

- (void)downloadDataSuccess:(LZXHttpRequest *)request {
    
    if (request.downloadData) {
        //清空之前数据
        if(_currentPage==0){
            [self.tableViewData removeAllObjects];
        }
        //解析数据  看数据 是xml 还是json
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:request.downloadData options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"下载数据%@",[[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:NULL] encoding:NSUTF8StringEncoding]);
        NSArray *itemArr = dict[@"items"];
        self.page_size=dict[@"page_size"];
        self.total=dict[@"total"];
        //遍历数组
        for (NSDictionary *itemDict in itemArr) {
            //把数据 保存到model 中
            CommentModel *model = [[CommentModel alloc] init];
            
            /*
             kvc会根据itemDict中的key 去model 找对应的属性 ，然后把itemDict中value 赋给相应地model属性值，
             如果itemDict字典的key 在model 中找不到对应的 属性名
             那么会调用 - (void)setValue:(id)value forUndefinedKey:(NSString *)key
             */
            
            //使用kvc 同时对多个属性赋值
            [model setValuesForKeysWithDictionary:itemDict];
            //加入数据源数组
            [self.tableViewData addObject:model];
            [model release];
        }
        //归档
        [self archiveMyData];
        //停止刷新
        [_tableView headerEndRefreshing];
        [_tableView footerEndRefreshing];
        //刷新 表格
        [_tableView reloadData];
       

        
    }
}

#pragma mark - UITableViewDataSource
//分割线顶端对齐
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        
        [cell setSeparatorInset:UIEdgeInsetsMake(0, 5, 0, 5)];
        
    }
    
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        
        [cell setLayoutMargins:UIEdgeInsetsMake(0, 5, 0, 5)];
        
    }
    
}

-(NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
   return  self.tableViewData.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    CommentTableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"CommentTableViewCell"];
    CommentModel *model=self.tableViewData[indexPath.row];
    cell.author_name.text=model.author_name;
   // NSLog(@"cell.author_name.text%@",cell.author_name.text);
    [cell.author_avatar sd_setImageWithURL:[NSURL URLWithString:model.author_avatar]placeholderImage:[UIImage imageNamed:@"alert_headc@2x.png"]];
    //自定uiimage的长宽
    UIGraphicsBeginImageContext(CGSizeMake(60, 60));
    [cell.author_avatar.image drawInRect:CGRectMake(0, 0, 60, 60)];
    cell.author_avatar.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    cell.content.text=model.content;
    CGRect contentFrame=cell.content.frame;
    cell.content.lineBreakMode = NSLineBreakByCharWrapping;
    //根据内容字符串动态计算高度
    contentFrame.size.height=[LZXHelper textHeightFromTextString:model.content width:304 fontSize:14];
    cell.updateTime.text=[LZXHelper dateStringFromNumberTimer:model.created_time];
    cell.content.frame=contentFrame;
    
    return cell;
}
//动态计算每个cell的高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    CommentModel *model=self.tableViewData[indexPath.row];
    CGFloat height=80;
    height +=[LZXHelper textHeightFromTextString:model.content width:304 fontSize:14];
    height +=10;
    
    return height;
}
/*
 iOS6之后通过代码来设置 当前旋转的视图控制器屏幕 必须是window的根视图控制器（window 的rootViewController）或者是rootViewController 模态(present)跳转出来的子视图控制器(push 的不行,push出得子视图控制 用代码设置旋转 是没有作用的)
 
 如果根视图控制器是导航 那么只能由导航的shouldAutorotate
 supportedInterfaceOrientations 重写这两个方法
 通过类别 或者继承的方式增补方法
 */
/*
 plist 配置文件设置的旋转方向控制的全局 所有界面的
 
 如果代码中子视图控制器也设置了那么在旋转那个子视图控制器的屏幕时取plist文件和代码设置 旋转的交集  如果没有交集程序就会crash 崩溃
 
 */
//需求:一般 写项目  app 只支持一个方向 这时我们只需要 把plist 改成支持 竖屏或者横屏就可以了
//需求2:有时候我们项目 中 app 需要 第二个界面 支持 三个方向旋转，第1个界面 只支持竖屏一个方向 ，这时我们 使用plist 文件 修改是不能实现的，
//解决:我们可以先用plist配置文件设置，然后通过代码的形式 单独 对 单个子视图控制器的界面进行设置旋转

//代码设置 需要写两个方法
//用代码控制 是否当前界面支持旋转
- (BOOL)shouldAutorotate {
    //代码设置 界面屏幕旋转 这个方法必须写在 window的根视图控制器 /或者 是window 的根视图控制器模态(present)出来的 类中才有效，否则 代码无效
    
    return YES;
}
//设置 当前界面 支持旋转的方向
- (NSUInteger)supportedInterfaceOrientations {
    //竖直方向
    return UIInterfaceOrientationMaskPortrait;
    
    //return UIInterfaceOrientationMaskPortrait;
    /*
     UIInterfaceOrientationMaskLandscapeLeft 左旋转
     UIInterfaceOrientationMaskLandscapeRight 右旋转
     UIInterfaceOrientationMaskAll 所有方向（要和plist文件 一起设置）
     UIInterfaceOrientationMaskAllButUpsideDown (除了向下 其他方向支持)
     */
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
